home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 095 / 131aobj.arc / ANSI.ASM next >
Assembly Source File  |  1985-08-24  |  6KB  |  126 lines

  1. ; ANSI1-5ASM  Revised 8/24/85 Dave Terry for QuickBasic Compiler
  2. ; ANSI1-4ASM  Revised 8/23/85 Dave Staehlin
  3.  
  4. ANSI_PRNT SEGMENT PUBLIC 'CODESG'       ;By  David W. Terry
  5.           ASSUME CS:ANSI_PRNT           ;    3036 So. Putnam Ct.
  6.           PUBLIC ANSI                   ;    West Valley City, UT 84120
  7.  
  8. ;                      Screen scroll mods by David C. Staehlin
  9. ;                                            5430 Candle Glow NE
  10. ;                                            Albuquerque, NM 87111
  11. ;
  12. ;                                                                                              Data (505) 821-7379 24 Hrs, 2400 Baud
  13. STRG_LEN          DW 0                  ;CHANGED TO LENGTH OF STRING PASSED
  14. VID_PAGE          DB 0                  ;Active video page
  15. ;
  16. ;
  17. ANSI      PROC    FAR
  18.           PUSH    BP
  19.           MOV     BP,SP
  20. ;
  21.           MOV     SI,10[BP]         ;GET STRING DESCRIPTOR
  22.           MOV     BL,[SI+ 2]        ;REARRANGE LOW/HIGH BYTES
  23.           MOV     BH,[SI+ 3]        ;NOW BX HOLDS THE ADDRESS OF THE STRING
  24.           MOV     AX,[SI]           ;GET STRING LENGTH
  25.           ADD     AX,BX             ;ADD INITIAL OFFSET (BX) TO LENGTH
  26.           MOV     STRG_LEN,AX       ;STORE OFFSET PLUS LENGTH
  27.  
  28.           PUSH    BX
  29.           MOV     AH,15             ;Get current video state
  30.           INT     10H
  31.           MOV     VID_PAGE,BH       ;Save it
  32.           POP     BX
  33.  
  34.           MOV     AH,02             ;SET UP FOR FUNCTION CALL 02H
  35. LOOP:
  36.           MOV     DL,[BX]           ;SET DL TO CHARACTER TO PRINT
  37.           PUSH    DX                ;Save the character in AX 'till we check..
  38.           CALL    WHERE_ARE_WE      ; where the cursor is.......
  39.           CMP     DH,17H            ;Row 23?
  40.           JL      NOPE              ; Jump if less......
  41.           CMP     DH,18H            ;Row 25?
  42.           JNZ     NEXT2             ;Keep checking if not
  43.           DEC     BX                ; Else backup one character
  44.           JMP     SCROLL2           ; And go scroll the screen
  45. ;
  46. NEXT2:    POP     DX                ;And restore the stack to where it was
  47.           CMP     DL,0AH            ;Do we have a line feed?
  48.           JZ      SCROLL            ; Yup - scroll this sucker!
  49.           CMP     DL,0DH            ;  How about a carriage return?
  50.           JNZ     NOPE1             ;  Nope - just go display it.......
  51.           INC     BX                ;  Yup - see if next char is a line feed
  52.           MOV     DX,[BX]
  53.           CMP     DL,0AH            ;  Well, is it?
  54.           JZ      SCROLL            ;  It sure is - let's go scroll
  55.           DEC     BX                ;  Oops - just a carriage return
  56.           JMP     SCROLL            ;  But let's go scroll it anyway
  57.  
  58. NOPE:     POP     DX
  59. NOPE1:    INT     21H               ;Else just display it - same old boring stuff
  60. SKIPIT:   INC     BX
  61.           CMP     BX,STRG_LEN
  62.           JL      LOOP              ;LOOP UNTIL ALL CHARS PROCESSED
  63. ;
  64.           MOV     AH,03             ;SET UP FOR ROM-BIOS CALL (03H)
  65.           MOV     BH,VID_PAGE       ;TO READ THE CURRENT CURSOR POSITION
  66.           INT     10H               ;  DH = ROW   DL = COLUMN
  67.           INC     DH                ;ADD 1 TO ROW (BECAUSE TOP OF SCREEN = 0)
  68.           INC     DL                ;ADD 1 TO COL (BECAUSE POS 1 = 0)
  69. ;
  70.           MOV     SI,[BP]+ 8
  71.           MOV     [SI],DH           ;PASS BACK ROW COORDINATE
  72.           MOV     SI,[BP]+ 6
  73.           MOV     [SI],DL           ;PASS BACK COLUMN COORDINATE
  74. ;
  75.           POP     BP
  76.           RET     6
  77. ANSI      ENDP
  78.  
  79. Where_Are_We:                    ;Get the current cursor position
  80.           PUSH    AX                ;Save the registers
  81.           PUSH    BX
  82.           PUSH    CX
  83.           MOV     AH,03             ;SET UP FOR ROM-BIOS CALL (03H)
  84.           MOV     BH,VID_PAGE       ;TO READ THE CURRENT CURSOR POSITION
  85.           INT     10H               ;  DH = ROW   DL = COLUMN
  86.           POP     CX                ;Restore the registers
  87.           POP     BX
  88.           POP     AX
  89.           RET                        ;And go back from wence we came
  90.  
  91. SCROLL2:  POP     DX                ;Put the stack like it was
  92. SCROLL:   CALL    SCROLLIT          ;Scroll the screen
  93.           JMP     SKIPIT
  94.  
  95. SCROLLIT: PUSH    AX                ;Save the registers that will be affected
  96.           PUSH    BX
  97.           PUSH    CX
  98.           PUSH    DX
  99.           PUSH    BP
  100.           MOV     AH,2              ;Now set cursor position to 23,0
  101.           MOV     DX,1700H          ;so we can get the proper character
  102.           MOV     BH,VID_PAGE       ;attribute
  103.           INT     10H
  104.           MOV     AH,8              ;Get the current character attribute
  105.           MOV     BH,VID_PAGE
  106.           INT     10H
  107.           MOV     BH,AH             ;Transfer the attribute to BH for next call
  108.           MOV     AH,6              ;Otherwise scroll 23 lines
  109.           MOV     AL,1              ; Only blank line 23
  110.           MOV     CX,0000H          ; Begin scroll at position 0,0
  111.           MOV     DX,174FH          ; End scroll at Line 23, Col 79
  112.           INT     10H               ; And do it.......
  113.           MOV     AH,2              ;Now set cursor position to 23,0
  114.           MOV     DX,1700H
  115.           MOV     BH,VID_PAGE
  116.           INT     10H
  117.           POP     BP
  118.           POP     DX                ;Restore the stack like it was
  119.           POP     CX
  120.           POP     BX
  121.           POP     AX
  122.           RET
  123.  
  124. ANSI_PRNT ENDS
  125.           END
  126.